package com.linln.modules.system.domain;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.linln.common.enums.StatusEnum;
import com.linln.common.utils.StatusUtil;
import com.linln.component.excel.annotation.Excel;
import com.linln.component.excel.enums.ExcelType;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.ToString;
import org.hibernate.annotations.SQLDelete;
import org.hibernate.annotations.Where;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;
import org.springframework.format.annotation.DateTimeFormat;

import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * @author 小懒虫
 * @date 2018/8/14
 */
@Data
@Entity
@Table(name = "pcs_order")
@ToString(exclude = {"dept", "roles"})
@EqualsAndHashCode(exclude = {"dept", "roles"})
@EntityListeners(AuditingEntityListener.class)
@SQLDelete(sql = "update pcs_order" + StatusUtil.SLICE_DELETE)
@Where(clause = StatusUtil.NOT_DELETE)
@Excel("订单")
public class Order implements Serializable {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Excel(value = "ID", type = ExcelType.EXPORT)
    private Long id;

    @CreatedDate
    @Excel("创建时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;
    @Transient
    private String createTimeStr;

    @LastModifiedDate
    @Excel("更新时间")
    private Date updateTime;

    @JsonIgnore
    private Long createUser;

    @JsonIgnore
    private Long updateUser;

    @Excel("患者ID")
    private Long patientId; // 新增字段

    @Excel("项目ID")
    private Long projectId; // 新增字段

    @Excel("护工当前服务人数限制")
    private Integer numberLimit;

    @Excel("项目阶段ID")
    private Long projectStageId; // 新增字段

    @Excel("价格")
    private Double price; // 新增字段

    @Excel("累计数量")
    private Integer num; // 新增字段

    @Excel("已消费金额")
    private Double total; // 新增字段

    @Excel("余额")
    private Double balance; // 新增字段

    @Excel("本次缴费(预缴费用可能有多次,记录当前的一次)")
    private Double currentMoney; // 新增字段


    @Excel("1 陪护 2 陪诊 3 陪检")
    private Integer type; // 新增字段

    @Excel("1按阶段选择 2按小时选择")
    private Integer stageType; // 新增字段

    @Excel("小时数(按小时选择)")
    private Integer hourNum; // 新增字段

    @Excel("阶段开始时间")
    private String timeStart; // 新增字段

    @Excel("阶段结束时间")
    private String timeEnd; // 新增字段

    @Excel("阶段虚拟结束时间(为了判断)")
    private String timeEndTemp; // 新增字段

    @Excel("服务开始日期(从哪一天开始)")
    private String startDay; // 新增字段

    @Excel("是否跨日  0否 1是")
    private Integer transDay; // 新增字段

    @Excel("患者自理能力 1 基本自理 2 半自理 3 完全失能")
    private Integer ability; // 新增字段

    @Excel("订单状态 -1 已取消 0 等待确认|等待抢单 1 等待签订合同 2 服务中 3 等待充值 4 服务完成 待评价")
    private Integer orderStatus; // 新增字段

    @Excel("订单结束时间")
    private String endTime; // 新增字段

    @Excel("当前服务的护工ID")
    private Long porterId; // 新增字段

    @Excel("当前服务的护工名称")
    private String porterName; // 新增字段

    @Excel("护理公司ID")
    private Long companyId; // 新增字段

    @Excel("备注")
    private String remark; // 新增字段

    @Excel("患者手机号码")
    private String phone; // 新增字段

    @Excel("护工手机号码")
    private String porterPhone; // 新增字段


    @Excel("订单号")
    private String sn; // 新增字段

    @Excel("患者姓名")
    private String patientName; // 新增字段

    @Excel("1 实时结算 2 延时结算")
    private Integer settlementType; // 新增字段

    @Excel("项目标题")
    private String projectTitle; // 新增字段

    @Excel("住院记录id")
    private Long patientAdmissionId; // 新增字段

    @Excel("是否结算1是2否")
    private Integer isSettled; // 新增字段

    @Excel("结算方式1线上支付2现金补缴")
    private Integer settledType; // 新增字段

    @Excel("是否住院 0否 1是")
    private Integer admissionStatus; // 新增字段

    @Excel("病区")
    private String depId; // 新增字段

    @Excel("病床号")
    private String bedNo; // 新增字段

    private Byte status = StatusEnum.OK.getCode(); // 新增字段

    private String depName;

    private String admissionTime;
    @Transient
    private String admissionTimeStr;

    private String projectStageName;

    @Excel("0 不需签订合同 1 需要签订合同")
    private Byte isNeedSignContract;

    @Excel("是否投诉 0否 1是")
    private Byte complainStatus;

    @Excel("是否投诉 0否 1是")
    private Byte evaluateStatus;

    @Excel("支付状态 0否 1是 2支付中 3支付失败")
    private Byte payStatus;

    @Excel("退款状态 0正常 1申请退款中 2已退款 3退款失败")
    private Byte refundStatus;

    @Excel("支付备注")
    private String payRemark;

    @Excel("退款备注")
    private String refundRemark;

    @Excel("签订或确认时间")
    private String concludeTime;

    @Excel("合同签名")
    private String pic;

    @Excel("签名时间")
    private String signTime;

    @Excel("是否签名 0否 1是")
    private Byte signStatus;

    @Excel("合同pdf地址")
    private String signCont;

    @Excel("预缴状态  0否 1是 2支付中 3支付失败")
    private Byte beforeStatus;

    @Excel("预缴备注")
    private String beforeRemark;

    @Transient
    private String cardNo;

    @Transient
    private Patient patient;

    @Transient
    private String companyName;

    @Transient
    private Byte sex;

    @Transient
    private String headimg;

    @Transient
    private String serviceNumber;

    @Transient
    private String allServiceNumber;

    @Transient
    private int age;

    @Transient
    private String birthDate;

    @Transient
    private String ethnicity;

    @Transient
    private ContractTpl contractTpl;

    @Transient
    private List<OrderLogs> orderLogList;

    @Transient
    private Porter porter;

    @Transient
    private Complain complain;

    @Transient
    private List<OrderPorters> orderPortersList;

    @Transient
    List<Map<String,List<OrderLogs>>> mapOrderLogsList;

    @Transient
    List<TempParam> tempParamList;

    private Integer isWl;//是否为五类人员0否 1是
    private Integer isCountCommission;

}
